package bond

const (
	// 源点.
	Unknown Bond = iota
	Self
	// 一级.
	BaBa
	MaMa
	ZhangFu
	QiZi
	ErZi
	NvEr
	// 二级.
	ZuFu
	ZuMu
	XiongDi
	JieMei

	WaiGong
	WaiPo

	GongGong
	PoPo

	YueFu
	YueMu

	ErXi
	SunZi
	SunNv

	NvXu
	WaiSun
	WaiSunNv
	// 三级.
	ZengZuFu
	ZengZuMu
	ShuBo
	GuGu

	ZengWaiZuFu
	ZengWaiZuMu

	XiongDiFu
	ZhiZi
	ZhiNv

	JieMeiXu
	WaiSheng
	WaiShengNv

	JiuJiu
	YiMa

	WaiZengWaiZuFu
	WaiZengWaiZuMu

	ZuWeng
	ZuPo

	TaiYueFu
	TaiYueMu
	JiuZi
	YiZi

	WaiTaiYueFu
	WaiTaiYueMu

	QinJiaGong
	QinJiaMu

	SunXi
	SunXu
	ChongSun
	ChongSunNv

	WaiChongSun
	WaiChongSunNv

	WaiSunFu
	WaiSunXu
	WaiZengSun
	WaiZengSunNv
	WaiZengWaiSun
	WaiZengWaiSunNv
	// 四级.
	GaoZuFu
	GaoZuMu
	TangZuFu
	GuNaiNai

	GaoWaiZuFu
	GaoWaiZuMu

	ShenNiang
	TangXiongDi
	TangJieMei
	GuFu

	GuBiaoXiongDi
	GuBiaoXiongMei

	ZengWaiZengZuFu
	ZengWaiZengZuMu
	ShuBoZengWanZuFu
	GuZengWanZuMu

	ZengWaiZengWaiZuFu
	ZengWaiZengWaiZuMu

	YinBoFu
	YinBoMu

	ZhiXi
	ZhiSun
	ZhiSunNv

	ZhiNvXu
	WaiZhiSun
	WaiZhiSunNv
)

// nolint: gochecknoglobals
var _bonds = map[Bond][6]Bond{
	// 源点
	Self: {BaBa, MaMa, ZhangFu, QiZi, ErZi, NvEr},
	// 一级
	BaBa:    {ZuFu, ZuMu, Unknown, MaMa, XiongDi, JieMei},
	MaMa:    {WaiGong, WaiPo, BaBa, Unknown, XiongDi, JieMei},
	ZhangFu: {GongGong, PoPo, Unknown, Self, ErZi, NvEr},
	QiZi:    {YueFu, YueMu, Self, Unknown, ErZi, NvEr},
	ErZi:    {ZhangFu, QiZi, Unknown, ErXi, SunZi, SunNv},
	NvEr:    {ZhangFu, QiZi, NvXu, Unknown, WaiSun, WaiSunNv},
	// 二级
	ZuFu:     {ZengZuFu, ZengZuMu, Unknown, ZuMu, ShuBo, GuGu},
	ZuMu:     {ZengWaiZuFu, ZengWaiZuMu, ZuFu, Unknown, ShuBo, GuGu},
	XiongDi:  {BaBa, MaMa, Unknown, XiongDiFu, ZhiZi, ZhiNv},
	JieMei:   {BaBa, MaMa, JieMeiXu, Unknown, WaiSheng, WaiShengNv},
	WaiGong:  {ZengWaiZuFu, ZengWaiZuMu, Unknown, WaiPo, JiuJiu, YiMa},
	WaiPo:    {WaiZengWaiZuFu, WaiZengWaiZuMu, WaiGong, Unknown, JiuJiu, YiMa},
	GongGong: {ZuWeng, ZuPo, Unknown, PoPo, ShuBo, GuGu},
	PoPo:     {WaiGong, WaiPo, GongGong, Unknown, ShuBo, GuGu},
	YueFu:    {TaiYueFu, TaiYueMu, Unknown, YueMu, JiuZi, YiZi},
	YueMu:    {WaiTaiYueFu, WaiTaiYueMu, YueFu, Unknown, JiuZi, YiZi},
	ErXi:     {QinJiaGong, QinJiaMu, ErZi, Unknown, SunZi, SunNv},
	SunZi:    {ErZi, ErXi, Unknown, SunXi, ChongSun, ChongSunNv},
	SunNv:    {ErZi, ErXi, SunXu, Unknown, WaiChongSun, WaiChongSunNv},
	NvXu:     {QinJiaGong, QinJiaMu, Unknown, NvEr, WaiSun, WaiSunNv},
	WaiSun:   {NvXu, NvEr, Unknown, WaiSunFu, WaiZengSun, WaiZengSunNv},
	WaiSunNv: {NvXu, NvEr, WaiSunXu, Unknown, WaiZengWaiSun, WaiZengWaiSunNv},
	// 三级
	ZengZuFu: {GaoZuFu, GaoZuMu, Unknown, ZengZuMu, TangZuFu, GuNaiNai},
	ZengZuMu: {GaoWaiZuFu, GaoWaiZuMu, ZengZuFu, Unknown, TangZuFu, GuNaiNai},
	ShuBo:    {ZuFu, ZuMu, Unknown, ShenNiang, TangXiongDi, TangJieMei},
	GuGu:     {ZuFu, ZuMu, GuFu, Unknown, GuBiaoXiongDi, GuBiaoXiongMei},

	ZengWaiZuFu: {ZengWaiZengZuFu, ZengWaiZengZuMu, Unknown, ZengWaiZuMu, ShuBoZengWanZuFu, GuZengWanZuMu},
	ZengWaiZuMu: {ZengWaiZengWaiZuFu, ZengWaiZengWaiZuMu, ZengWaiZuFu, Unknown, ShuBoZengWanZuFu, GuZengWanZuMu},

	XiongDiFu: {YinBoFu, YinBoMu, XiongDi, Unknown, ZhiZi, ZhiNv},
	ZhiZi:     {XiongDi, XiongDiFu, Unknown, ZhiXi, ZhiSun, ZhiSunNv},
	ZhiNv:     {XiongDi, XiongDiFu, ZhiNvXu, Unknown, WaiZhiSun, WaiZhiSunNv},

	JieMeiXu:   {},
	WaiSheng:   {},
	WaiShengNv: {},

	JiuJiu: {},
	YiMa:   {},

	WaiZengWaiZuFu: {},
	WaiZengWaiZuMu: {},

	ZuWeng: {},
	ZuPo:   {},

	TaiYueFu: {},
	TaiYueMu: {},
	JiuZi:    {},
	YiZi:     {},

	WaiTaiYueFu: {},
	WaiTaiYueMu: {},

	QinJiaGong: {},
	QinJiaMu:   {},

	SunXi:      {},
	SunXu:      {},
	ChongSun:   {},
	ChongSunNv: {},

	WaiChongSun:   {},
	WaiChongSunNv: {},

	WaiSunFu:        {},
	WaiSunXu:        {},
	WaiZengSun:      {},
	WaiZengSunNv:    {},
	WaiZengWaiSun:   {},
	WaiZengWaiSunNv: {},
}

// nolint: gochecknoglobals
var _simple = map[Bond]string{
	// 源点
	Self: "本人",
	// 一级
	BaBa:    "爸爸",
	MaMa:    "妈妈",
	ZhangFu: "丈夫",
	QiZi:    "妻子",
	ErZi:    "儿子",
	NvEr:    "女儿",
	// 二级
	ZuFu:    "祖父",
	ZuMu:    "祖母",
	XiongDi: "兄弟",
	JieMei:  "姐妹",

	WaiGong: "外公",
	WaiPo:   "外婆",

	GongGong: "公公",
	PoPo:     "婆婆",

	YueFu: "岳父",
	YueMu: "岳母",

	ErXi:  "儿媳",
	SunZi: "孙子",
	SunNv: "孙女",

	NvXu:     "女婿",
	WaiSun:   "外孙",
	WaiSunNv: "外孙女",
	// 三级
	ZengZuFu: "曾祖父",
	ShuBo:    "叔叔",
	GuGu:     "姑姑",

	ZengWaiZuFu: "曾外祖父",
	ZengWaiZuMu: "曾外祖母",

	XiongDiFu: "兄弟妇",
	ZhiZi:     "侄子",
	ZhiNv:     "侄女",

	JieMeiXu:   "姐妹婿",
	WaiSheng:   "外甥",
	WaiShengNv: "外甥女",

	JiuJiu: "舅舅",
	YiMa:   "姨妈",

	WaiZengWaiZuFu: "外曾外祖父",
	WaiZengWaiZuMu: "外曾外祖母",

	ZuWeng: "祖翁",
	ZuPo:   "祖婆",

	TaiYueFu: "太岳父",
	TaiYueMu: "太岳母",
	JiuZi:    "舅子",
	YiZi:     "姨子",

	WaiTaiYueFu: "外太岳父",
	WaiTaiYueMu: "外太岳母",

	QinJiaGong: "亲家公",
	QinJiaMu:   "亲家母",

	SunXi:      "孙媳",
	SunXu:      "孙婿",
	ChongSun:   "重孙",
	ChongSunNv: "重孙女",

	WaiChongSun:   "外重孙",
	WaiChongSunNv: "外重孙女",

	WaiSunFu:        "外孙妇",
	WaiSunXu:        "外孙婿",
	WaiZengSun:      "外曾孙",
	WaiZengSunNv:    "外曾孙女",
	WaiZengWaiSun:   "外曾外孙",
	WaiZengWaiSunNv: "外曾外孙女",
	// 四级.
	GaoZuFu:  "高祖父",
	GaoZuMu:  "高祖母",
	TangZuFu: "堂祖父",
	GuNaiNai: "姑奶奶",

	GaoWaiZuFu: "高外祖父",
	GaoWaiZuMu: "高外祖母",

	ShenNiang:   "婶娘",
	TangXiongDi: "堂兄弟",
	TangJieMei:  "堂姐妹",
	GuFu:        "姑父",

	GuBiaoXiongDi:  "姑表兄弟",
	GuBiaoXiongMei: "姑表兄妹",

	ZengWaiZengZuFu:  "曾外曾祖父",
	ZengWaiZengZuMu:  "曾外曾祖母",
	ShuBoZengWanZuFu: "叔伯曾外祖父",
	GuZengWanZuMu:    "高曾外祖母",

	ZengWaiZengWaiZuFu: "曾外曾外祖父",
	ZengWaiZengWaiZuMu: "曾外曾外祖母",

	YinBoFu: "姻伯父",
	YinBoMu: "姻伯母",

	ZhiXi:    "侄媳",
	ZhiSun:   "侄孙",
	ZhiSunNv: "侄孙女",

	ZhiNvXu:     "侄女婿",
	WaiZhiSun:   "外侄孙",
	WaiZhiSunNv: "外侄孙女",
}

// nolint: gochecknoglobals
var _complex = map[Bond][2]string{
	XiongDi:   {"弟", "哥"},
	JieMei:    {"妹", "姐"},
	ShuBo:     {"叔", "伯"},
	GuGu:      {"姑", "姑"},
	JiuJiu:    {"舅", "舅"},
	YiMa:      {"姨", "姨"},
	JiuZi:     {"舅子", "舅子"},
	YiZi:      {"姨子", "姨子"},
	ShenNiang: {"婶", "伯母"},
	JieMeiXu:  {"妹夫", "姐夫"},
}
